Android N新特性-多窗口模式适配

  • 1. 多窗口模式的开关

默认情况下,我们的App都是允许多窗口的,但是,如果没有进行属性的设置,会系统会抛出一个提示这个应用可能不支持多窗口模式,其实就是android系统不知道开发者是否为该App做了适配工作

那么,如果我们的应用要支持这个模式并且不让这个消息弹出来,要怎么做呢?

很简单,只需要在Activity声明的时候加入一个属性resizeableActivity,并且设置其值为true即可:

1
2
3
4
5
6
7
8
<activity
android:name=".MainActivity"
android:resizeableActivity="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
    <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>

这个属性的设置会导致三种情况:

① 如果不声明这个属性,那么默认允许进入多窗口模式,但是会有上面图片的提示(第一次运行的时候)
② 如果声明了这个属性,并设置值为true,那么允许进入多窗口模式,并且不会提示
③ 如果声明了这个属性,并设置值为false,那么不允许进入多窗口模式,只允许全屏显示

若应用targetSDKVersion为N,则该应用下所有Activity的resizeableActivity属性均默认为true,即该应用下的所有Activity均能支持多窗口显示。

若Activity1配置resizeableActivity为true,Activity1、Activity2、Activity3均处于同一Task,则Activity2和Activity3均能在多窗口下显示(即使Activity2和Activity3没有配置resizeableActivity属性)。
若Activity2需全屏显示,则需按以下步骤配置:
1、设置resizeableActivity为false

android:resizeableActivity=”false

2、Activity1启动Activity2时,设置FLAG_ACTIVITY_NEW_TASK,Activity2运行在单独的Task,即和Activity1不在同一Task。

1
2
3
Intent intent= newIntent(this,Activity2.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
  • 多窗口模式的适配

当我们允许App进入多窗口模式之后,App只能占据屏幕的一部分

可以看到,在App的上半部分是一个蓝色的图片背景,在上面显示了当前的天气状况,但是如果我们不进行适配,那么进入了多窗口模式之后,这个部分的内容就会几乎占满整个窗口,这个时候我们就需要进行一下适配,当进入多窗口模式之后更换掉这一个布局,将内容进行重新排版,以便显示更多的内容。

多窗口下对应用窗口大小缩放,会触发Configuration变化,可能的变化有screenSize、smallestScreenSize、layoutDirection、screenLayout、orientation,建议Activity的manifest配置configChanges,否则Activity将被销毁重建,可能导致卡顿和跟体验差。

我们知道,values-sw400dp,sw400dp就表明了这个value是在屏幕最短边大于等于400dp的时候生效(前提是有其他不同的value文件夹)

因此在configChanges时候,应用便会去自动寻找匹配的alues值,从而改变我们layout

在宽度变化的时候,我们的应用可能最小dp只有200dp这样,而以往我们很少适配200dp的屏幕

对于多窗口模式,宽度也是经常变化的,而在以往,我们的app宽度都是固定的,很少去适配宽度变化。

  • 多窗口下Activity生命周期注意事项
    1.Android N版本多窗口下运行的两个同时可见的Activity,只有一个处于Resumed状态,有别于华为多窗口的方案(两个可见的Activity同时处于Resumed状态)。

如果是视频、社交、浏览器等类型的应用,在N版本设备多窗口下运行,建议在onStart/onStop中处理play/pause逻辑,而不要在onResume/onPause方法中处理

如何知道是否处于多窗口模式
说明:N版本API Activity类新增inMultiWindow方法,判断当前Activity是否处于多窗口模
式(split-screen,freeform,pip)

如何知道是否处于PiP模式
说明:N版本API Activity类新增inPictureInPicture方法,判断当前Activity是否处于PiP模式。

如何监听是否进入多窗口模式
说明:N版本API Activity类新增onMultiWindowModeChanged方法,监听Activity是否进入
多窗口模式。
注:inMultiWindow为true,则表示处于多窗口模式(split-screen,freeform,pip);否则,已退出多窗口模式。

如何监听是否进入PiP模式
说明:N版本API Activity类新增onPictureInPictureChanged方法,监听Activity是否进入
PiP模式。
inPictureInPicture为true,则表示处于Pip模式;否则,已退出Pip模式。如果Activity要进入PiP模式,可通过调用 方法,使Activity自身
进入PiP模式,前提条件是该Activity的 为true。

  • 多窗口模式中打开新的窗口处理

要在另一个窗口中打开一个Activity,接着我们只需要给这个Intent设置一个标签,完整代码如下:

1
2
3
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(geoLocation);
intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT);

这个时候我们再运行,调用的窗口会在另一个窗口中被打开。

  • 验证适配是否正常
    1、 全屏下启动应用,长按Recent启动多窗口,
    验证应用是否能正常切换到多窗口下显示。
    
    2、 全屏下按Recent显示最近任务列表,拖拽应用标题栏到屏幕高亮区域,
    验证应用是否能正常在多窗口下显示。
    
    3、 拖动分割线,对窗口大小缩放,验证UI是否显示正常,功能是否能正常使用。
    4、 如果应用定义minimalSize,则验证窗口大小是否能缩放到低于
    minimalSize值。
    
    5、 性能测试,验证窗口缩放时,UI重绘是否存在性能问题。

本文作者:Jerey_Jobs

简书地址:Anderson大码渣

github地址:Jerey_Jobs